package org.fast.develop.logicflow.runtime;

import cn.hutool.core.util.StrUtil;

import java.util.Map;
import java.util.Objects;

/**
 * 项 目 名：Global-Platform-Infrastructure
 * 源文件名：com.geekstorm.titan.framework.data.common.converter.PersistEnum2DB 文件版本：1.0.0 创建人：
 * 莫寅 创建日期：2020-03-07 10:46 修改作者：莫寅 修改日期：2020-03-07 10:46 文件描述：保存到数据库的数据类型 By：2020 ©
 * CompanyName , Inc. All Rights Reserved.
 */
public interface PersistEnum2DB {

	/**
	 * 用于显示的枚举名
	 * @return
	 */
	String getDisplay();

	/**
	 * 存储到数据库的枚举值
	 * @return
	 */
	String getValue();

	// 按枚举的value获取枚举实例
	static <T extends PersistEnum2DB> T fromValue(Class<T> enumType, String value) {
		for (T object : enumType.getEnumConstants()) {
			if (value.equalsIgnoreCase(object.getValue())) {
				return object;
			}
			else if (value.equalsIgnoreCase(object.toString())) {
				return object;
			}
		}
		return null;
		// throw new IllegalArgumentException("No enum value " + value + " of " +
		// enumType.getCanonicalName());
	}

	static <T extends PersistEnum2DB> T create(Class<T> enumType, Object name) {
		if (Objects.nonNull(name) && StrUtil.isEmpty(name.toString())) {
			return null;
		}

		Class<T> tClass = enumType;

		String value = null;

		Objects.requireNonNull(name, "value is not be null！");

		if (name instanceof Map) {
			if (((Map) name).get("value") == null) {
				return null;
				// throw new IllegalArgumentException("value is not be null！");
			}
			value = ((Map) name).get("value").toString();
		}
		else {
			value = name.toString();
		}

		try {
			return PersistEnum2DB.fromValue(tClass, value);
		}
		catch (IllegalArgumentException e) {
			throw new IllegalArgumentException("No element matches " + name);
		}
	}

}
